5.02. Фреймворки
Фреймворки
Фреймворки в экосистеме Python предоставляют готовые инструменты для маршрутизации, обработки запросов, работы с базами данных, аутентификации и многого другого, позволяя разработчикам сосредоточиться на бизнес-логике, а не на низкоуровневой инфраструктуре.
Давайте рассмотрим фреймворки, и сгруппируем их как синхронные и асинхронные.
Синхронные фреймворки
Синхронные фреймворки обрабатывают один HTTP-запрос за раз в рамках одного потока. Пока запрос не завершён (например, ожидается ответ от базы данных), поток блокируется. Это простая модель, но она может стать узким местом при высокой нагрузке или большом количестве I/O-операций.
Django — это полноценный веб-фреймворк с широким набором встроенных возможностей: ORM, админка, система шаблонов, аутентификация, миграции, кэширование и многое другое.
У него есть высокий уровень абстракции, мощная ORM, поддерживающая множественные БД (PostgreSQL, MySQL, SQLite), встроенная админ-панель для управления данными, поддержка MVC/MVT-архитектуры. Пример:
from django.http import HttpResponse
from django.views import View
def hello(request):
return HttpResponse("Hello from Django!")
Django применяется в Instagram, Pinterest, Mozilla, The Washington Post.
Flask — минималистичный фреймворк, предоставляющий только базовые инструменты: маршрутизацию, обработку запросов и шаблоны. Всё остальное (ORM, валидация, авторизация) добавляется через расширения.
Собственно, это главная особенность - гибкая архитектура, можно начать с малого и масштабироваться в дальнейшем. Здесь довольно богатая экосистема расширений, к примеру, Flask-SQLAlchemy, Flask-WTF, Flask-Login. Пример:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello from Flask!"
Pyramid позиционируется как фреймворк для проектов любого масштаба — от простых скриптов до крупных систем. Здесь есть поддержка как минималистичного, так и расширенного подхода, гибкая система маршрутизации, интеграция с различными ORM и шаблонизаторами. Подходит, когда нужна гибкость Flask, но с возможностью масштабирования до уровня Django.
Асинхронные фреймворки
Асинхронные фреймворки используют модель event loop и корутины (async/await), что позволяет обрабатывать тысячи соединений одновременно без блокировки потоков. Это особенно важно для I/O-bound задач: сетевые запросы, работа с БД, WebSocket.
aiohttp — один из первых асинхронных фреймворков на Python, построенный на asyncio. Он поддерживает как серверную часть (web server), так и асинхронный HTTP-клиент.
Ключевые возможности - обработка тысяч запросов параллельно, поддержка WebSocket. Пример:
from aiohttp import web
async def hello(request):
return web.Response(text="Hello from Aiohttp!")
app = web.Application()
app.add_routes([web.get('/', hello)])
web.run_app(app)
FastAPI — один из самых популярных современных фреймворков, сочетающий асинхронность, автоматическую документацию (Swagger/OpenAPI) и поддержку аннотаций типов.
Он основан на Starlette (для web) и Pydantic (для валидации), имеет автоматическую генерацию интерактивной документации, и высокую производительность (оправдывая название). Пример:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello():
return {"message": "Hello from FastAPI!"}
gevent — это библиотека, реализующая cooperative multitasking с помощью зелёных потоков (greenlets). Она позволяет запускать синхронный код в асинхронном режиме, перехватывая I/O-вызовы. Она перезаписывает стандартные функции ввода-вывода (например, socket, time.sleep) на неблокирующие версии и не требует использования async/await.
from gevent.pywsgi import WSGIServer
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Flask + Gevent!'
# Запуск Flask с Gevent
http_server = WSGIServer(('0.0.0.0', 5000), app)
http_server.serve_forever()
Это нужно для ускорения уже существующих Flask/Django-приложений.
Хотя Flask изначально был синхронным, с выходом Flask 2.0 и Python 3.7+ он получил поддержку асинхронных view-функций. Начиная с Flask 2.0, можно использовать async def:
from flask import Flask
import asyncio
app = Flask(__name__)
@app.route('/async')
async def async_route():
await asyncio.sleep(1)
return "Async in Flask!"
С ограничениями, конечно. Асинхронность работает только с ASGI-серверами (например, Hypercorn, Uvicorn) и большинство расширений Flask всё ещё синхронные, и нет поддержки WebSocket. Flask можно использовать в асинхронном режиме, но он не является «нативно асинхронным» фреймворком, как FastAPI или Aiohttp.